package com.micro.train.service;

import com.micro.train.entity.TrainSeat;
import com.micro.train.entity.SeatInventory;
import com.micro.train.dto.TrainInventoryDTO;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 火车座位服务接口（7天滚动窗口库存管理）
 */
public interface TrainSeatService {
    
    /**
     * 添加座位信息
     */
    TrainSeat addSeat(TrainSeat seat);
    
    /**
     * 批量添加座位
     */
    List<TrainSeat> addSeats(List<TrainSeat> seats);
    
    /**
     * 更新座位信息
     */
    TrainSeat updateSeat(Long seatId, TrainSeat seat);
    
    /**
     * 删除座位信息
     */
    void deleteSeat(Long seatId);
    
    /**
     * 获取所有座位信息
     */
    List<TrainSeat> getAllSeats();
    
    /**
     * 根据ID获取座位信息
     */
    TrainSeat getSeatById(Long seatId);
    
    /**
     * 根据列车ID获取所有座位
     */
    List<TrainSeat> getSeatsByTrainId(Long trainId);
    
    /**
     * 根据车厢ID获取所有座位
     */
    List<TrainSeat> getSeatsByCarriageId(Long carriageId);
    
    /**
     * 根据座位类型获取座位
     */
    List<TrainSeat> getSeatsByType(Integer seatType);
    
    /**
     * 根据列车ID和座位类型获取座位
     */
    List<TrainSeat> getSeatsByTrainIdAndType(Long trainId, Integer seatType);
    
    /**
     * 根据价格范围查询座位
     */
    List<TrainSeat> getSeatsByPriceRange(BigDecimal minPrice, BigDecimal maxPrice);
    
    /**
     * 购买车票（7天滚动窗口）
     */
    Long purchaseTicket(Long trainId, Integer seatType, Integer quantity, LocalDate travelDate);
    
    /**
     * 获取列车库存信息（7天滚动窗口）
     */
    TrainInventoryDTO getTrainInventory(Long trainId, LocalDate travelDate);
    
    /**
     * 获取指定日期的可用座位数量
     */
    Integer getAvailableSeatCount(Long trainId, Integer seatType, LocalDate travelDate);
    
    /**
     * 获取座位库存状态
     */
    SeatInventory getSeatInventory(Long seatId, LocalDate baseDate);
    
    /**
     * 更新座位库存状态
     */
    boolean updateSeatInventory(SeatInventory inventory);
    
    /**
     * 初始化7天库存窗口
     */
    void initializeInventoryWindow(Long trainId, LocalDate baseDate);
    
    /**
     * 滚动更新7天库存窗口
     */
    void rollInventoryWindow(LocalDate newBaseDate);
    
    /**
     * 清理过期库存记录
     */
    void cleanupExpiredInventory(LocalDate expireDate);
    
    /**
     * 清理指定基准日期的库存记录
     */
    void cleanupInventoryByBaseDate(LocalDate baseDate);
    
    /**
     * 获取指定日期的座位库存详情
     */
    List<SeatInventory> getSeatInventoriesByDate(Long trainId, LocalDate travelDate);
}
